Ejemplo de CodeSandbox https://codesandbox.io/s/throbbing-worker-8s68n?file=/src/index.js
Así que tengo un objeto y estoy actualizando el nombre de la clave eliminando el __número, quiero mover la primera clave [694 y 695] al interior del objeto como id = 694. No logré que eso sucediera porque Obtengo un nuevo objeto para cada valor clave (vea el código a continuación).
var options = { "694": { "title_694": "Tiger", "category_694": "848", "description_694": "long description" }, "695": { "title_694": "Turtles", "category_694": "347", "description_694": "long description" } }y aquí está mi código
Object.keys(options).map( value => ( { [value] : Object.keys(options[value]).map((keyName) => ( {[keyName.replace(/_*\d+/g, '')] : options[value][keyName]} )) } ) )sale como se muestra a continuación
[ { "694": [ { "title": "Tiger" }, { "category": "848" }, { "description": "long description" } ] }, { "695": [ { "title": "Turtles" }, { "category": "347" }, { "description": "long description" } ] } ]¿Cómo puede hacer que funcione como se muestra a continuación?
[ { "id": 694, "title": "Tiger", "category": "848", "description": "long description" }, { "id":695, "title": "Turtles", "category": "347", "description": "long description" } ]Hay una manera de hacerlo sin mapa:
var result = []; Object.keys(options).forEach((element) => { result.push({ id: element, ...options[element] }); });Producción:
[ { "id": "694", "title_694": "Tiger", "category_694": "848", "description_694": "long description" }, { "id": "695", "title_694": "Turtles", "category_694": "347", "description_694": "long description" } ]Pregúntame si tienes más preguntas. Pero necesita más código para eliminar la identificación del nuevo objeto de claves
Usar forEach sin cambiar los nombres de las claves en el objeto original
var result = []; Object.keys(options).forEach((element) => { const item = Object.fromEntries( Object.entries(options[element]).map(([k, v]) => { k = k.replace(/_*\d+/g, ""); return [k, v] }) ) result = [...result,{ id: element, ...item }] // Or you could use push which is slightly faster // To see benchmarks Google Spread operator vs push site: measurethat.net // result.push({ id: element, ...options[element] }); }); document.getElementById("app").innerHTML = `<pre>${JSON.stringify( result, null, 4 )}</pre>`; console.log(result);La salida
[ { "id": "694", "title": "Tiger", "category": "848", "description": "long description" }, { "id": "695", "title": "Turtles", "category": "347", "description": "long description" } ]Personalmente, como usted, prefiero no construir manualmente una matriz completamente nueva.
var options = { "694": { "title_694": "Tiger", "category_694": "848", "description_694": "long description" }, "695": { "title_694": "Turtles", "category_694": "347", "description_694": "long description" } } let mutated = Object.values(Object.entries(options).map(([id, option]) => { return Object.assign({ id: id, }, Object.fromEntries(Object.entries(option).map(([key, value]) => { return [key.replace(/_*\d+$/g, ''), value]; }))); })); Esto permite que la primera función de map cree una nueva matriz en consecuencia, Object.assign garantiza que tenga un solo objeto de cada uno, y Object.entries y Object.fromEntries para convertir en una matriz de pares para luego convertir las claves y luego volver de la matriz de pares.
Lea la documentación de MDN relacionada con Object.entries : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries
Eso también enlaza con la documentación de Object.fromEntries .
Como nota al margen, modifiqué su expresión regular para incluir la coincidencia de fin de línea, de modo que modifique algo como w3tag_694 de la manera esperada. También sugeriría cambiar el * en la expresión regular a un + para ser un poco más estricto.
Hay una advertencia: fromEntries es una característica relativamente nueva, pero es compatible con todos los principales navegadores que aún son compatibles con sus creadores. Consulte el soporte: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries#browser_compatibility